package com.campus.commons.utils;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.campus.commons.entity.CheckEvening;
import com.campus.commons.entity.CloudFile;
import com.campus.commons.entity.EveningSubject;
import com.campus.commons.entity.Feedback;
import com.campus.commons.utils.excel.EasyExcel_X;
import com.campus.commons.utils.oss.AliOssCloudUtil;
import com.campus.web.controller.IndexController;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Predicate;
@Component
public class Tool  {
    public static final String[] USER = {"authorities"};
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static Calendar calendar = new GregorianCalendar();


    /**
     * 排除查询字段；祭奠用的，
     *
     * @param clz
     * @param filters
     * @param <T>
     * @return
     */
    public static <T> QueryWrapper exclude(T clz, String... filters) {
        QueryWrapper<T> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.select((Class<T>) clz.getClass(), new Predicate<TableFieldInfo>() {
                    @Override
                    public boolean test(TableFieldInfo tableFieldInfo) {
                        boolean b = true;
                        for (String filter : filters) {
                            if (tableFieldInfo.getColumn().equals(filter)) {
                                b = false;
                            }
                        }
                        return b;
                    }
                }
        );
        return userQueryWrapper;
    }

    /**
     * 传入时间返回 yyyy-MM-dd； 传入null 返回当前时间
     *
     * @param date
     * @return
     */
    public static String getDateToString(Date date) {
        if (date == null) {
            date = new Date();
        }
        return dateFormat.format(date);
    }

    public static String getDateToString(String type, Date date) {
        SimpleDateFormat datetime = new SimpleDateFormat(type);

        if (date == null) {
            date = new Date();
        }
        return datetime.format(date);
    }

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 获取本周第一天日期
     *
     * @param date 指定日期 一般new Date()
     * @return
     */
    public String getFirstDayOfWeek(Date date) {
        Calendar cal = Calendar.getInstance();
        try {
            cal.setTime(date);
            cal.set(Calendar.DAY_OF_WEEK, 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return simpleDateFormat.format(cal.getTime());
    }

    /**
     * 获取本周最后一天日期
     *
     * @param date 指定日期
     * @return
     */
    public String getLastDayOfWeek(Date date) {
        Calendar cal = Calendar.getInstance();
        try {
            cal.setTime(date);
            cal.set(Calendar.DAY_OF_WEEK, 2);
            cal.set(Calendar.DATE, cal.get(Calendar.DATE) + 6);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return simpleDateFormat.format(cal.getTime());
    }

    /**
     * 日期转化天数
     *
     * @param datetime
     * @return
     */
    public static String dateToWeek(Date datetime) {


        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar cal = Calendar.getInstance(); // 获得一个日历
        Date datet = null;
        try {
            datet = dateFormat.parse(getDateToString(datetime));
            cal.setTime(datet);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
        if (w < 0) {
            w = 0;
        }
        return weekDays[w];
    }

    /**
     * 字符转时间；
     *
     * @param value  字符串
     * @param format 格式如： yyyy--MM-DD
     * @return 转换时间；
     */
    public static Date getDate(String value, String format) {
        try {
            return new SimpleDateFormat(format).parse(value);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }




    /**
     * 传入一个时间 和一个天数; 返回Date
     *
     * @param date 当前时间
     * @param day  日期增加|减少.整数往后推,负数往前移动;
     * @return
     */
    public static Date diffDate(Date date, Integer day) {
        calendar.setTime(date);
        calendar.add(Calendar.DATE, day);
        return calendar.getTime();
    }


    /**
     * 字符串转换Date时间类型  yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static Date toDate(String date) {
        Date transDate = null;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));

        try {
            if (date != null) {
                transDate = sdf.parse(date);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return transDate;
    }

    /**
     * 传入指定参数导出表格；并上传到Oss服务器；
     *
     * @param templateName 模板的名字； 注；该文件只能放在 file/excel_template/ 下；
     * @param fileSuffix   文件的名字加后戳；
     * @param data         封住好的数据；
     * @param deId         部门Id
     * @return 返回一个上传好的文件；
     */
    public static CloudFile exportExcel(String templateName, String fileSuffix, Map<String, Object> data, Integer deId) {
        String now = getDateToString(null);
        String fileName = now + fileSuffix;
        String fileTemplatePath = "file/excel_template/" + templateName;
        File file = EasyExcel_X.writeExcel(IndexController.webPath + fileTemplatePath, fileName, data);
        //上传； file
        Map<String, String> map = AliOssCloudUtil.uploadFile2OSS(file.getAbsolutePath(), fileName, false);
        CloudFile cloudFile = new CloudFile(fileName, map.get("url"), file.length(), deId, map.get("fileRelativePath"));
        //删除文件
        file.delete();
        return cloudFile;
    }

    /** 使用Mybatis进行分页的时候使用，
     * 将page转换成 mysql limit的数据偏移量；
     * @param myPage
     * @return 处理好偏移量的myPage
     */
    public static MyPage pageConverterToOffset(MyPage myPage) {
        Integer page = myPage.getPage();
        page = page < 1 ? 1 : page;
        myPage.setPage((page - 1) * myPage.getLimit());
        return myPage;
    }




    /**
     * 纪念方法： 更好的替代： selectById
     * @param id
     * @return
     */
    @Deprecated
    public static QueryWrapper getOne(Integer id) {
        QueryWrapper<Feedback> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", id);
        return queryWrapper;
    }

    /**
     * 过去七天的日期
     * @param date
     * @return
     */
    public static String _7DaysBefore(Date date) {
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, - 7);
        Date d = calendar.getTime();
        String day = dateFormat.format(d);
        return day;
    }

    /**
     * 一个月前
     * @param date
     * @return
     */
    public static String a_month_ago(Date date) {
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, -1);
        Date m = calendar.getTime();
        String mon = dateFormat.format(m);
        return mon;
    }


}
